package com.ybg.engine;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import com.ybg.engine.task.Task;
import com.ybg.util.LogUtil;


/**
 * 调度引擎工具类，包括添加删除任务和开关调度引擎
 * 
 * @author zhouqixin
 */
public class JobEngineFactory {
	private static Scheduler scheduler = null;

	/**
	 * 开启调度引擎
	 */
	public static void start() {
		try {
			// 通过SchedulerFactory工厂类获取Scheduler
			SchedulerFactory sf = new StdSchedulerFactory();
			scheduler = sf.getScheduler();
			scheduler.start();
		} catch (Exception localException) {
			LogUtil.error("调度引擎启动失败", localException);
		}
	}

	/**
	 * 关闭调度引擎
	 */
	public static void stop() {
		try {
			if (scheduler != null) {
				scheduler.shutdown(false);
				scheduler = null;
			}
		} catch (Exception localException) {
			LogUtil.error("关闭调度引擎失败", localException);
		}
	}

	/**
	 * 添加一个调度任务到运行中的调度引擎
	 * 
	 * @param taskClass
	 * @param cronExpress
	 * @return
	 */
	public static boolean startJob(Class<? extends Task> taskClass,
			String cronExpress) {
		// 用于描叙Job实现类及其他的一些静态信息，构建一个作业实例
		JobDetail jobDetail = JobBuilder.newJob(taskClass)
				.withIdentity(taskClass.getName() + "--task").build();
		CronTrigger trigger;
		try {
			trigger = TriggerBuilder
					.newTrigger()
					.withIdentity(taskClass.getName() + "--trigger")
					.withSchedule(CronScheduleBuilder.cronSchedule(cronExpress))
					.build();
			// 运行容器，使用SchedulerFactory创建Scheduler实例
			// 向Scheduler添加一个job和trigger
			scheduler.scheduleJob(jobDetail, trigger);
			return true;
		} catch (Exception e) {
			LogUtil.error("开启调度任务:"+taskClass.getName()+"失败",e);
			return false;
		}
	}

	/**
	 * 删除调度任务的触发器和任务实例
	 * 
	 * @param taskClass
	 * @return
	 */
	public static boolean stopJob(Class<? extends Task> taskClass) {
		try {
			TriggerKey localTriggerKey = new TriggerKey(taskClass.getName()
					+ "--trigger");
			scheduler.unscheduleJob(localTriggerKey);
			JobKey localJobKey = new JobKey(taskClass.getName() + "--task");
			scheduler.deleteJob(localJobKey);
		} catch (Exception e) {
			LogUtil.error("停止调度任务"+taskClass.getName()+"失败",e);
			return false;
		}
		return true;
	}
}